package cn.tedu.elasticsearch.repository;

import cn.tedu.elasticsearch.entity.Item;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.elasticsearch.annotations.Query;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Repository;

//Spring中持久层命名规范就是repository
@Repository
public interface ItemRepository extends ElasticsearchRepository<Item,Long> {
    //当前ItemRepository接口继承了SpringDataES提供的父接口ElasticsearchRepository
    //一旦继承，效果是会为指定的实体类自动生成基本的增删改查方法
    //ElasticsearchRepository<[实体类类型],[实体类主键类型]>
    //SpringData自定义查询，遵循框架给定的格式，编写方法名称，就可以自动生成查询语言
    /*
     query(查询)：表示当前方法为查询方法，类似sql中的select
     Items/Item:表示要查询的实体类，不带s返回单个对象，带上s返回集合类型
     By(通过): 标识开始设置条件的关键字，类似sql中的where
     Title: 要查询的字段
     Matches:执行的查询操作，Matches表示执行查询支持分词的字符串，类似sql中的like
     */
    Iterable<Item> queryItemsByTitleMatches(String title);

    //简化上面单条件查询的方法名
    @Query("{\n" +
            "    \"match\": {\n" +
            "      \"title\": \"?0\"\n" +
            "    }\n" +
            "  }\n")
    Iterable<Item> queryOne(String title);
    //多条件查询
    @Query("{\n" +
            "    \"bool\": {\n" +
            "      \"should\": [\n" +
            "        {\"match\": {\"title\": \"?0\"}},\n" +
            "        {\"match\": {\"brand\": \"?1\"}}\n" +
            "      ]\n" +
            "    }\n" +
            "  }")
    Iterable<Item> queryOr(String title, String brand);

    //排序查询
   // Iterable<Item> queryItemsByTitleMatchesOrBrandMatchesOrderByPriceDesc(String title,String brand);
    //分页查询
    //所谓分页查询就是将返回结果分批次呈现给用户，不一次性展示出来
    //返回值类型是Page，传入参数类型也需要添加一个Pageable类型的参数
    //在排序查询的基础上做修改
    Page<Item> queryItemsByTitleMatchesOrBrandMatchesOrderByPriceDesc(
            String title, String brand, Pageable pageable);
}
